import {FormControl, FormGroup, NonNullableFormBuilder, Validators} from '@angular/forms';
import {Component, EventEmitter, Input, Output, OnInit, OnChanges, SimpleChanges} from '@angular/core';
import {EmployeeService} from "../employee.service"
import {Employee} from "../employee.type"
import {format} from "date-fns";
import {NzMessageService} from "ng-zorro-antd/message";

//定义手机号码正则表达式
const PHONE_NUMBER_REGEXP =
  /^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\d{8}$/;

@Component({
  selector: 'app-employee-update',
  templateUrl: './employee-update.component.html',
  styleUrl: './employee-update.component.scss'
})

/**
 * 员工修改组件类
 */
export class EmployeeUpdateComponent implements OnInit, OnChanges {

  constructor(private employeesService: EmployeeService, //员工服务
              private nzMessageService: NzMessageService, //消息服务
              private fb: NonNullableFormBuilder //表单构建器
  ) {
    //初始化表单
    this.editForm = this.fb.group({
      name: ['', [Validators.required, Validators.minLength(2)]],
      gender: ['', [Validators.required]],
      email: ['', [Validators.required, Validators.email]],
      phoneNumber: ['', [Validators.pattern(PHONE_NUMBER_REGEXP)]],
      joinDate: ['', [this.joinDateValidate]],
    });
  }

  //ngOnChanges生命周期钩子，用于监听editData的变化
  ngOnChanges(changes: SimpleChanges) {
    //检查editData是否存在
    if (this.editData) {
      //将editData.joinDate转换为Date对象，并将其赋值给joinDate变量
      const joinDate = new Date(this.editData.joinDate)
      //使用patchValue方法更新editForm，将editData中的所有属性（包括转换后的joinDate）合并并赋值给editForm
      this.editForm.patchValue({...this.editData, joinDate: new Date(joinDate)})
    }
  }

  ngOnInit() {
  }

  @Input() //接收父组件的数据
  visible: boolean = false //控制组件的可见性，默认为false
  @Input()
  id: number = 0 //组件的唯一标识，默认为0
  @Output() //发出事件
  update = new EventEmitter() //用于向父组件发送更新事件，携带更新的id

  @Input() //接收父组件的数据
  editData: any; //用于接收父组件传入的编辑数据

  editForm: FormGroup; //表单控件的集合，用于构建编辑表单

  //入职时间校验
  joinDateValidate(control: FormControl) {
    const selectDate = +control.value; //选择的日期转换为数字
    const curDate = +new Date(); //当前日期转换为数字
    if (selectDate > curDate) {
      return {date: true}; //如果选择的日期晚于当前日期，返回日期错误信息
    }
    return null; //选择的日期合法，返回null
  }

  //修改
  edit(): void {
    if (!this.editForm.valid) return; //如果表单无效则不执行添加逻辑
    let joinDate = this.editForm.value.joinDate; //获取入职日期

    //将日期转换为"yyyy-MM-dd"格式
    joinDate = format(joinDate, 'yyyy-MM-dd');

    //将当前表单值和指定的加入日期合并成一个新的对象
    let params = Object.assign(
      {...this.editForm.value}, //将当前表单的值复制到新对象中
      {joinDate: joinDate} //将格式化后的日期加入到提交的参数中
    );
    //调用员工服务中的edit方法，传入员工id和参数
    this.employeesService.edit(this.id, params).subscribe((employee: Employee) => {
      this.update.emit(employee) //当修改员工成功后，将编辑后的员工信息通过update事件发出
    });
    this.nzMessageService.success('修改成功')
  }

  //取消修改
  cancelEdit() {
    this.update.emit() //发出取消修改事件
    this.nzMessageService.success('取消修改')
  }
}
